#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <string>
#include <fstream>
#include <streambuf>
#include <sstream>
#include <cstdlib>
#include <new>
#include <typeinfo>
#include <list>
#include <thread> // std::thread
#include <mutex>  // std::mutex

using namespace std;

// 参考: https://blog.csdn.net/misayaaaaa/article/details/53786215
// 参考: https://github.com/applenob/Cpp_Primer_Practice
// chapter 10




// 10. 你认为算法不改变容器大小的原因是什么？

解：

将算法和容器的成员函数区分开。
算法的参数是迭代器，不是容器本身





// 14.编写一个lambda，接受两个int，返回它们的和。

auto f = [](int i, int j) { return i + j; };


知识点1：我们希望对算法进行更多参数的操作，衍生出lambda表达式，一个lambda表达式表示一个可调用代码单元，它可以定义在函数的内部。表达式的形式：f = [捕获列表](参数列表){函数体}，参数列表为空时，()可省略。
知识点2：如果未指定返回内容，则lambda返回void。

知识点3：lambda只有在捕获列表中捕获一个它所在函数的局部变量才能在函数体中使用该变量，lambda可以直接使用定义在函数之外的名字或者局部static变量

首先练习一下将上一题改成使用lambda表达式




// 21. 编写一个 lambda，捕获一个局部 int 变量，并递减变量值，直至它变为0。一旦变量变为0，再调用lambda应该不再递减变量。lambda应该返回一个bool值，指出捕获的变量是否为0。

解：

	int i = 10;
	auto f = [&i]() -> bool { return (i == 0 ? true : !(i--)); };
	while (!f()) cout << i << endl;



// 23. bind 接受几个参数？

假设被绑定的函数接受 n 个参数，那么bind 接受n + 1个参数。
知识点：bind()函数，头文件为functional，作用是将参数隐式的增多，接受一个可调用参数，生成一个新的可调用对象。
auto func1 = bind(func2, _1,sz);//_n表示占位符，由func1调用时提供。调用func1时，就会替换为func2函数。





// 26.
解释三种插入迭代器的不同之处。

解：

back_inserter 使用 push_back 
front_inserter 使用 push_front
inserter 使用 insert，此函数接受第二个参数，这个参数必须是一个指向给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前








int main()
{
   
    printf("hello c++ \n");
}